#include<bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
const int N = 2e5 + 10;
#define INF 0x3f3f3f3f;
typedef long long int ll;
#define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
//----------------------------------------------------------------------------//
ll n, p, t, w[1010], f[1010][1010];//跳到第i个点,跳了j次的最大权值
int main()
{
    close();
    cin >> n >> p >> t; //n个点,每次不能跳超过p次,每个点权值为w
    for(int i = 1; i <= n; i++) cin >> w[i];

    memset(f, 128, sizeof f);
    for(int i = 1; i <= p && i <= n + 1; i++) f[i][1] = w[i]; //1~p格跳一步到达第i格的权值就是w[i],且p可能大于n,另一端指的是n+1不是n,且n+1没权值
    for(int i = 1; i <= n + 1; i++) //枚举跳到第几个点
    {
        for(int j = 2; j <= t; j++) //从第二步开始跳,第一步已经初始化了
        {
            for(int k = 1; k <= p && k < i; k++) //枚举从哪个点跳过来的 上一次跳k格跳到第i个点,k<i等于也不行,减去k最小到第1格
            {
                f[i][j] = max(f[i - k][j - 1] + w[i], f[i][j]);
            }
        }
    }
    cout << f[n + 1][t] << '\n';


    return 0;
}